﻿/*****************************************************************//**
 * @file    GraphEventOperator.h
 * @brief   三维可视对象数据操作器接口类。
 *  
 * @author  ChengHaotian (yeguangbaozi@foxmail.com)
 * @date    2024-06-12
 *********************************************************************/

#ifndef __GRAPHEVENTOPERATOR_H__
#define __GRAPHEVENTOPERATOR_H__

#include "FITK_Kernel/FITKCore/FITKAbstractOperator.h"

#include "OperatorsInterfaceAPI.h"

#include <QColor>
#include <QVariant>

// 前置声明
namespace Exchange
{
    class FITKAcousticsVTKGraphObject3D;
}

namespace EventOper
{
    /**
     * @brief  渲染工具类型
     * @author BaGuijun (baguijun@163.com)
     * @date   2025-02-21
     */
    enum class GraphToolType {
        ToolNone,
        ToolDirection,       //方向
    };
    /**
     * @brief   三维可视对象数据操作器接口类。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-06-12
     */
    class OperatorsInterfaceAPI GraphEventOperator : public Core::FITKAbstractOperator
    {
        Q_OBJECT

    public:
        /**
         * @brief   构造函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        explicit GraphEventOperator() = default;

        /**
         * @brief   析构函数。[虚函数]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        virtual ~GraphEventOperator() = default;

        // 刷新数据接口。
        //@{
        /**
         * @brief   刷新全部类型可视化对象。（没有则创建）[虚函数]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void updateAll(bool forceUpdate = false);
        /**
         * @brief    刷新全部可视化对象的可见性。【没有不会创建】
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-11
         */
        virtual void updateAllVisibility();
        /**
         * @brief   根据提供的数据对象ID更新对应可视化对象。（没有则创建）[虚函数]
         *          （暂不支持通过该接口刷新SEA节点可视化对象。）
         * @param   dataObjId：数据对象ID
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        virtual void updateGraph(int dataObjId, bool forceUpdate = false);

        /**
         * @brief   刷新所有几何与FE模型网格部件。[虚函数]
         * @param   autoCreate：自动创建不存在的可视化对象[缺省]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-29
         */
        virtual void updateGeoAndMesh(bool autoCreate = true, bool forceUpdate = false);

        /**
         * @brief   刷新所有几何可见性。[虚函数]
         * @param   autoCreate：自动创建不存在的可视化对象[缺省]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-05
         */
        virtual void updateGeometrys(bool autoCreate = true, bool forceUpdate = false);

        /**
         * @brief   刷新所有FE模型网格部件可见性。[虚函数]
         * @param   autoCreate：自动创建不存在的可视化对象[缺省]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-05
         */
        virtual void updateMeshes(bool autoCreate = true, bool forceUpdate = false);

        /**
         * @brief   刷新SEA节点可见性。（自动创建可视化对象）[虚函数]
         * @param   forceUpdate：是否强制刷新（重新创建节点可视化对象）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-29
         */
        virtual void updateDiscNodes(bool forceUpdate = false);

        /**
         * @brief   刷新SEA自由边。（强制刷新，自动创建可视化对象）[虚函数]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void updateSEAFreeEdges();

        /**
         * @brief   刷新全部SEA子系统对象。（自动创建可视化对象）[虚函数]
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-04
         */
        virtual void updateSEASubSystems(bool forceUpdate = false);

        /**
         * @brief   刷新全部指定的SEA子系统对象。（不自动创建可视化对象）[虚函数]
         * @param   subSysTypeEnum：SEA子系统类型枚举值
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-25
         */
        virtual void updateSEASubSystem(int subSysTypeEnum, bool forceUpdate = false);
        /**
         * @brief    更新全部连接对象（自动创建可视化对象）[虚函数]
         * @param[i] forceUpdate                    是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-10
         */
        virtual void updateJunctions(bool forceUpdate = false);
        /**
         * @brief    刷新全部FE子系统对象。（自动创建可视化对象）[虚函数]
         * @param[i] forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        virtual void updateFESubSystems(bool forceUpdate = false);
        /**
         * @brief    刷新全部FE面对象。（自动创建可视化对象）[虚函数]
         * @param[i] forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        virtual void updateFEFaces(bool forceUpdate = false);
        /**
         * @brief   刷新全部载荷对象。（自动创建可视化对象）[虚函数]
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        virtual void updateLoads(bool forceUpdate = false);
        /**
         * @brief   刷新全部传感器对象。（自动创建可视化对象）[虚函数]
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        virtual void updateSensors(bool forceUpdate = false);
        //@}

        // 切换显示/隐藏接口。
        //@{
        /**
         * @brief   显示或隐藏几何与网格。（不自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setCADVisiblity(bool visibility);

        /**
         * @brief   显示或隐藏几何。（不自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setGeometrysVisiblity(bool visibility);

        /**
         * @brief   显示或隐藏几何点。（不自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        virtual void setGeoPointsVisiblity(bool visibility);

        /**
         * @brief   显示或隐藏几何线。（不自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        virtual void setGeoEdgesVisiblity(bool visibility);

        /**
         * @brief   显示或隐藏几何面。（不自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        virtual void setGeoFacesVisiblity(bool visibility);

        /**
         * @brief   显示或隐藏几何体。（不自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        virtual void setGeoSolidsVisiblity(bool visibility);

        /**
         * @brief   显示或隐藏网格。（不自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setMeshesVisiblity(bool visibility);

        /**
         * @brief   刷新已用SEA节点可见性。（自动创建可视化对象）[虚函数]
         * @param   visibleObjects：是否显示可见对象上的SEA节点
         * @param   unused：是否显示未被用到的SEA节点
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setUsedDiscNodesVisibility(bool visibility);

        /**
         * @brief   刷新未用SEA节点可见性。（自动创建可视化对象）[虚函数]
         * @param   visibleObjects：是否显示可见对象上的SEA节点
         * @param   unused：是否显示未被用到的SEA节点
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setUnusedDiscNodesVisibility(bool visibility);
        /**
         * @brief    设置点标签的可见性
         * @param[i] visibility                          可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-21
         */
        virtual void setNodeLabelsVisibility(bool visibility);

        /**
         * @brief   刷新SEA节点可见性。（自动创建可视化对象）[虚函数]
         * @param   visibleObjects：是否显示可见对象上的SEA节点
         * @param   unused：是否显示未被用到的SEA节点
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setDiscNodesVisibility(bool visibleObjects, bool unused);

        /**
         * @brief   刷新SEA自由边对象可见性。（重新计算，自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setSEAFreeEdgesVisibility(bool visibility);

        /**
         * @brief   刷新全部类型子系统对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setSubSystemsVisibility(bool visibility);

        /**
         * @brief   刷新全部类型的SEA子系统对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setSEASubSystemsVisibility(bool visibility);
        /**
         * @brief    刷新SEA全部子系统板对象的可见性。（自动创建可视化对象）[重写]
         * @param[i] visibility                          可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-18
         */
        virtual void setSEASubSystemShellsVisibility(bool visibility);
        /**
         * @brief   刷新全部指定类型的SEA子系统对象可见性。（自动创建可视化对象）[虚函数]
         * @param   subSysTypeEnum：SEA子系统类型枚举值
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        virtual void setSEASubSystemsVisibility(int subSysTypeEnum, bool visibility);

        /**
         * @brief    刷新FE类型子系统对象可见性。（自动创建可视化对象）[虚函数]
         * @param    visibility：可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        virtual void setFESubSystemsVisibility(bool visibility);

        /**
         * @brief   刷新全部连接关系对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        virtual void setJunctionsVisibility(bool visibility);

        /**
         * @brief   刷新全部连接点对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        virtual void setJunctionPointsVisibility(bool visibility);

        /**
         * @brief   刷新全部连接线对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        virtual void setJunctionLinesVisibility(bool visibility);

        /**
         * @brief   刷新全部连接区域对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        virtual void setJunctionAreasVisibility(bool visibility);

        /**
         * @brief   刷新全部SEA连接点对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        virtual void setSEAJunctionPointsVisibility(bool visibility);

        /**
         * @brief   刷新全部SEA连接线对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        virtual void setSEAJunctionLinesVisibility(bool visibility);

        /**
         * @brief   刷新全部SEA连接区域对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        virtual void setSEAJunctionAreasVisibility(bool visibility);

        /**
         * @brief    刷新全部FE面显示。（自动创建可视化对象）[虚函数]
         * @param    visibility：可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        virtual void setFEFaceVisibility(bool visibility);
        /**
         * @brief    刷新全部FE结构显示。（自动创建可视化对象）[虚函数]
         * @param[i] visibility                    可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-02
         */
        virtual void setFEStructVisibility(bool visibility);
        /**
         * @brief    刷新全部FE声腔显示。（自动创建可视化对象）[虚函数]
         * @param[i] visibility                    可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-02
         */
        virtual void setFEAcousticsVisibility(bool visibility);

        /**
         * @brief   刷新全部载荷对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        virtual void setLoadsVisibility(bool visibility);

        /**
         * @brief   刷新全部力矩载荷对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        virtual void setLoadsPointForceVisibility(bool visibility);

        /**
         * @brief   刷新全部功率载荷对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        virtual void setLoadsPowerVisibility(bool visibility);

        /**
         * @brief   刷新全部约束载荷对象可见性。（自动创建可视化对象）[虚函数]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        virtual void setLoadsConstraintVisibility(bool visibility);
        /**
         * @brief    刷新全部HVAC噪声载荷对象可见性（自动创建可视化对象）[虚函数]
         * @param[i] visibility                      可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-15
         */
        virtual void setLoadsHVACNoiseVisibility(bool visibility);
        /**
         * @brief    刷新全部单极子载荷对象可见性（自动创建可视化对象）[重写]
         * @param[i] visibility                      可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-15
         */
        virtual void setLoadsMonopoleVisibility(bool visibility);
        /**
         * @brief    刷新全部传感器对象可见性。（自动创建可视化对象）[虚函数]
         * @param[i] visibility                     可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-14
         */
        virtual void setSensorVisibility(bool visibility);
        /**
         * @brief    根据提供的数据对象ID递归更新对应可视化对象。（没有则不创建）
         * @param    dataObjId：数据对象ID
         * @param    refLayer：更新引用数据的层级（-1则递归至根数据）[缺省]
         * @param    recDown：向下递归（被引用方向查询）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-14
         */
        virtual void updateGraphRecursively(int dataObjId, int refLayer = 2, bool recDown = true);
        //@}

        // 附加高级功能。
        //@{
        /**
         * @brief   是否开启子系统缩放模式。（爆炸效果）[虚函数]
         * @param   isOn：是否开启
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-11
         */
        virtual void setEnableSubSystemScale(bool isOn);
        //@}

        // 高亮功能接口。
        //@{
        /**
         * @brief    高亮
         * @param    objID             高亮数据对象
         * @param    forceUpdate       是否强制刷新
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-16
         */
        virtual void hightGraphObj(int objID, bool forceUpdate = false);
        /**
         * @brief    取消高亮
         * @param[i] objID             取消高亮数据对象
         * @param[i] forceUpdate       是否强制刷新
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-16
         */
        virtual void disHightGraphObj(int objID, bool forceUpdate = false);
        /**
         * @brief    清除所有与高亮
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-16
         */
        virtual void clearAllHightGraph();
        //@}

        // 渲染专用接口。
        //@{
        /**
         * @brief   刷新渲染窗口。[虚函数]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-07-24
         */
        virtual void reRender();
        /**
         * @brief    自适应
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-03-06
         */
        virtual void fitView();

        /**
         * @brief   根据相机视角变化刷新可视化对象（相机操作自动调用，无需外部手动调用）。[虚函数]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-06
         */
        virtual void updateWithCameraChanged();
        //@}

        // 工具方法。
        //@{
        
        /**
         * @brief    创建渲染工具
         * @param[i] type                    渲染工具类型
         * @return   int                     渲染工具id
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-21
         */
        virtual int createGraphTool(GraphToolType type);
        /**
         * @brief    删除渲染工具
         * @param[i] toolId                       渲染工具id
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-21
         */
        virtual void deleteToolObject(const int& toolId);
        /**
         * @brief    更新工具方向数据
         * @param[i] objId                        渲染工具id
         * @param[i] direction                    方向
         * @param[i] pos                          位置
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-21
         */
        virtual void updateDirection(int objId, double* direction, double* pos);
        //@}

    };
}   // namespace EventOper

#endif // __GRAPHEVENTOPERATOR_H__